// 引入配置

import Config from './config.js'
import Cookie from "./cookie.js"
// 此vm参数为页面的实例，可以通过它引用vuex中的变量
export const Request = (vm) => {
	// 初始化请求配置
	uni.$uv.http.setConfig((config) => {
		console.log(Config)
		/* config 为默认全局配置*/
		config.baseURL = Config.baseUrl /* 根域名 */
		return config
	})

	// 请求拦截
	uni.$uv.http.interceptors.request.use((config) => { // 可使用async await 做异步操作
		// console.log(config)
		// 初始化请求拦截器时，会执行此方法，此时data为undefined，赋予默认{}
		if (config.method == "UPLOAD") {
			config.data = config.data || {}
		} else if (config.method == "DOWNLOAD") {
			config.data = config.data || {}
			config.baseURL = ''
		} else {
			config.data = config.data.params || {}
		}

		// 根据custom参数中配置的是否需要token，添加对应的请求头
		const token = Cookie.getToken()
		// config.params = config.data.params
		const header = {
			token: Cookie.getToken(),
			language: Cookie.getLanguage(),
			'Content-Type': config.data.contentType || 'application/x-www-form-urlencoded'
		}

		// application/json
		// application/x-www-form-urlencoded
		config.header = header
		// console.log(config)
		return config
	}, config => { // 可使用async await 做异步操作
		return Promise.reject(config)
	})

	// 响应拦截
	uni.$uv.http.interceptors.response.use((response) => {
		/* 对响应成功做点什么 可使用async await 做异步操作*/

		const data = response.data

		// 失败
		if (data.code !== 0) {
			// 如果没有显式定义custom的toast参数为false的话，默认对报错进行toast弹出提示
			// uni.$uv.toast(data.message)
			if (data.code === 401) {
				uni.reLaunch({
					url: "/pages/index/index?errorCode=401"
				})
			} else {
				// this.$refs.toast.show(data.msg)
				const pages = getCurrentPages();
				const page = pages[pages.length - 1];
				const pageVM = page.$vm;
				pageVM.$nextTick(() => {
					pageVM.$refs.toast.show({
						msg: data.msg
					})
				});
			}
			// 如果需要catch返回，则进行reject
			return Promise.reject(data)
		}
		//  成功
		return data.data === undefined ? {} : data.data
	}, (response) => {
		// 对响应错误做点什么 （statusCode !== 200）
		return Promise.reject(response)
	})
}